<?php
/**
 * @Author: king
 * @Last Modified by:   king
 * Date: 2018/7/25
 * Time: 10:18
 */

namespace App\Tools\Base;

use App\Exceptions\ApiException;
use App\Tools\IAuth;
use App\Tools\Time;
use Cache;
use Illuminate\Routing\Controller;
use Request;

/**
 * API模块 公共的控制器
 * Class Common
 * @package App\Tools\Base
 */
class Common extends Controller
{
    /**
     * headers信息
     * @var string
     */
    public $headers = '';

    /**
     * 初始化的方法
     */
    public function __construct()
    {
        //$this->testAes();
        // 验证请求是否合法
        $this->checkRequestAuth();
        
    }

    /**
     * 检查每次app请求的数据是否合法
     */
    public function checkRequestAuth()
    {

        // 首先需要获取headers

        $headers = $this->processHeaders(request()->header());
        if (!defined('IS_ACCESS_TOKEN_CHECKED')) {
            // sign 加密需要 客户端工程师 ， 解密：服务端工程师
            // 1 headers body 仿照sign 做参数的加解密
            // 2
            // 3
            // 基础参数校验

            if (!isset($headers['sign'])) {
                throw new ApiException('接口请求失败', 200, 0);
            }
           // var_dump(config('app.app_types'));die;
            if (strpos(config('app.app_types'), $headers['app-type']) === false) {
                throw new ApiException('当前设备不支持', 200,0);
            }

            // 需要sign
            // if (IAuth::checkSignPass($headers)) {
            //     throw new ApiException('接口请求失败', 200, 0);
            // }

            // 1、文件  2、mysql 3、redis   由于服务器为集群架构   此处使用redis
            Cache::set($headers['sign'], 1, config('app.app_sign_cache_time'));

            define('IS_ACCESS_TOKEN_CHECKED', true);
        }

        // 将当前请求头信息存入header属性中，以便后面使用
        $this->headers = $headers;
        // 将当前请求数据解密后存入request_data 属性中
        //        halt($this->data);
    }
    
    /**
 * 处理请求头，将数组值转换为单一值
 * @param array $headers
 * @return array
 */
private function processHeaders($headers)
{
    $processedHeaders = [];
    foreach ($headers as $key => $value) {
        // 将数组值转换为单一值
        $processedHeaders[$key] = reset($value);
    }
    return $processedHeaders;
}

   
}
